package pers.wchen.mybatis.generate.template;

import pers.wchen.mybatis.generate.util.FileUtil;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @作者： wchen
 * @描述：
 * @创建时间： 2018/2/8 23:43
 * @版本：Copyright 2018, Inc. All Rights Reserved.
 * @修改信息：
 */
public abstract class AbsTemplateAnalysis implements BaseAnalysis{

    public String[] templatePaths;
    public Map<String, Map<String, StringBuffer>> tempResultMap;

    /**
     *  @描述: 路径处理，待优化
     *  @参数： [paths]
     *  @返回值： java.lang.String[]
     *  @创建人: wchen
     *  @创建时间: 2018/2/9
     *  @修改人和其它信息:
     */
    private String[] dealPath(String[] paths){

        Set set = new HashSet();
        for(String path : paths){
            if(path.contains("*")){
                String regularPath = path.substring(path.lastIndexOf("/"), path.indexOf("*"));
                String directoryPath = path.substring(0, path.lastIndexOf("/"));
                System.out.println("regularPath: " + regularPath);
                List<String> pathList = FileUtil.getAllFile(directoryPath, regularPath);
                for(String getPath : pathList){
                    set.add(getPath);
                }
            }
        }
        List<String> resultList = new ArrayList();
        resultList.addAll(set);

        return (String[]) resultList.toArray();
    }

    /**
     * @描述: 模板解析
     * @参数：
     * @返回值：
     * @创建人: wchen
     * @创建时间: 2018/2/8
     * @修改人和其它信息:
     */
    public void analysisTemplate() {
        List<StringBuffer> temps = readTemplate();
    }

    /**
     * @描述: 模板读取
     * @参数：
     * @返回值：
     * @创建人: wchen
     * @创建时间: 2018/2/8
     * @修改人和其它信息:
     */
    private List<StringBuffer> readTemplate() {
        List<StringBuffer> tempList = new ArrayList<StringBuffer>();
        for(String path : templatePaths){
            StringBuffer sbf = FileUtil.readTemp(path);
            tempMatcher(sbf);
        }
        return tempList;
    }



    /**
     *  @描述: 模板增、删、改、匹配并写入map（拆分）
     *  @参数： [str]
     *  @返回值： void
     *  @创建人: wchen
     *  @创建时间: 2018/2/9
     *  @修改人和其它信息:
     */
    public void tempMatcher(StringBuffer str){
        String tempId;
        String dealType = null;
        if((tempId = matcherTempType(str, "insert")) != null){
            dealType = "insert";
        }

        if((tempId = matcherTempType(str, "delete")) != null){
            dealType = "delete";
        }

        if((tempId = matcherTempType(str, "update")) != null){
            dealType = "update";
        }

        if((tempId = matcherTempType(str, "select")) != null){
            dealType = "select";
        }

        if(dealType == null){
            return ;
        }
        //模板写入
        setResult(dealType, tempId, str);
    }


    /**
     *  @描述: 匹配模板类型，返回模板id，未定义模板则为0（拆分）
     *  @参数： [templateStr, regular]
     *  @返回值： java.lang.String
     *  @创建人: wchen
     *  @创建时间: 2018/2/9
     *  @修改人和其它信息:
     */
    private String matcherTempType(StringBuffer templateStr, String regular){
        //<@insert_001>
        Pattern pattern = Pattern.compile("<@" + regular + "_[0-9]+>");
        Matcher matcher = pattern.matcher(templateStr.toString());
        if(matcher.find()){
            int start = matcher.start();
            int end = matcher.end();
            templateStr.replace(start, end, "");

            String label = matcher.group();
            pattern = Pattern.compile("[0-9]+");
            matcher = pattern.matcher(label);
            if(matcher.find()){
                return matcher.group();
            }else{
                return "0";
            }
        }else{
            return null;
        }
    }


    /**
     *  @描述: 模板写入到公用map（拆分）
     *  @参数： [outerKey, innerKey, value]
     *  @返回值： void
     *  @创建人: wchen
     *  @创建时间: 2018/2/9
     *  @修改人和其它信息:
     */
    private void setResult(String outerKey, String innerKey, StringBuffer value){

        Map<String, StringBuffer> outerMap = this.tempResultMap.get(outerKey);
        if(outerMap == null){
            outerMap = new HashMap<String, StringBuffer>();
            outerMap.put(innerKey, value);
            this.tempResultMap.put(outerKey, outerMap);
        }else{
            outerMap.put(innerKey, value);
        }
    }

    /**
     * @描述: 获取解析后的结果
     * @参数：
     * @返回值：
     * @创建人: wchen
     * @创建时间: 2018/2/9
     * @修改人和其它信息:
     */
    public Map<String, Map<String, StringBuffer>> getAnalysisResult() {
        return this.tempResultMap;
    }
}
